home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 20 / Cream of the Crop 20 (Terry Blount) (1996).iso / program / kh_gdi.zip / GR_MWND.CPP < prev    next >
C/C++ Source or Header  |  1996-05-10  |  11KB  |  318 lines

  1. /*  Project gdi_demo
  2.     
  3.     Copyright ⌐ 1995. All Rights Reserved.
  4.  
  5.     SUBSYSTEM:    gdi_demo.exe Application
  6.     FILE:         gd_dmwnd.cpp
  7.     AUTHOR:       S.Vartanov
  8.  
  9.  
  10.     OVERVIEW
  11.     ========
  12.     Source file for implementation of gdi_demoWindow (TWindow).      
  13. */
  14.  
  15.  
  16. #include <owl\owlpch.h>
  17. #pragma hdrstop
  18.  
  19. #include "gd_dmapp.h"
  20.  
  21. #include "gd_dmwnd.h"
  22.  
  23. #include <stdio.h>
  24. #include <math.h>
  25.  
  26. //
  27. // Build a response table for all messages/commands handled
  28. // by the application.
  29. //
  30. DEFINE_RESPONSE_TABLE1(gdi_demoWindow, TWindow)
  31. //{{gdi_demoWindowRSP_TBL_BEGIN}}
  32. //{{gdi_demoWindowRSP_TBL_END}}
  33. END_RESPONSE_TABLE;
  34.  
  35.  
  36. //{{gdi_demoWindow Implementation}}
  37.  
  38.  
  39. //////////////////////////////////////////////////////////
  40. // gdi_demoWindow
  41. // ==========
  42. // Construction/Destruction handling.
  43. gdi_demoWindow::gdi_demoWindow (TWindow* parent, const char far* title, TModule* module)
  44.      : TWindow(parent, title, module)
  45. {
  46.      // INSERT>> Your constructor code here.
  47.  
  48. }
  49.  
  50.  
  51. gdi_demoWindow::~gdi_demoWindow ()
  52. {
  53.      Destroy();
  54.  
  55.      // INSERT>> Your destructor code here.
  56.  
  57. }
  58. //////////////////////// DEMO //////////////////////////////////////
  59. //#include <stdlib.h>
  60. #include "kh_graf\graf.h"
  61.  
  62. class Demo : public Graf
  63.      {
  64.      public:
  65.     void graf_demo();  // Not optimized !!!
  66.     void draw_stacked(double* xar, double* bar, double* car, rect r);
  67.     };
  68. ///////////////////
  69. // The following code was developed using SLANG and only after testing
  70. // translated to C++
  71. void Demo::graf_demo()
  72.      {
  73.      rotate(0, 0, 0);
  74.      setfillstyle(SOLID_FILL, BLACK);
  75.      set_fill(ON);
  76.      rectangle(0, 0, 1000, 1000);
  77.  
  78.  
  79. //     drawTool = (KH_Paint*)this;   // See KHPAINT.H
  80.  
  81.      int shifts[20]; // We suppose to use this array for bar grafs shists
  82.      memset(shifts, 0, 20 * sizeof(int));
  83.      double xar[5];
  84.      double yar[5];
  85.      double dar[5];
  86.      int tar[6];
  87.  
  88.      for(int i = 1; i < 6; i++)
  89.     {
  90.     xar[i - 1] = i;
  91.     yar[i - 1] = (double)i * i - 10;
  92.     dar[i - 1] = (double)i * i / 2;
  93.     tar[i - 1] = log10((double)i) * 200;      // Tick, Manual
  94.     }
  95.     tar[5] = log10(6) * 200;
  96.  
  97.     set_graf_clip(30, 10, 200, 200);               // Set area on screen
  98.      set_marker_size(8);  // Do it before calc_scale() in the case of bar graf
  99. // double* ar, int axe (X-0, Y-1), int is_first, int n, int num);
  100.     calc_scale(xar, 0, 1, 5, -1);
  101.     calc_scale(dar, 1, 1, 5, -1);          // y-scale, first, resize
  102.     calc_scale(yar, 1, 0, 5, -1);          // y-scale, not first, resize
  103.     calc_scale(yar, 1, 0, 5, 1);       // and fit to nice-looking scale
  104. // I do not use symbolic names for colors to show that it is translation
  105. // from SLANG. This method is much more effective than direct C++ programming
  106.     setcolor(12); setfillstyle(1, 3);
  107. //  Manual axe setup:
  108. //  void set_axe(int which_axe, int axe_len,
  109. //        double start = 0, double end = 0,
  110. //        int tick_no = 0, int* ticks_on_axe = NULL,
  111. //        int s_tick_no = 0, int* sub_ticks_on_axe = NULL,
  112. //        char** legends_on_axe = NULL, int text_direction = HORIZ_AXE);
  113. // Axes numeration: HORIZ1 = 1, VERT1 = 2, HORIZ2 = 4, VERT2 = 8
  114. // xmin == xmax => manual axe scaling
  115.      char* s[] = { "One", "Two", "Three", "Four", "Five", "Six" };
  116.      set_axe(HORIZ1, clip.width(), 0, 0, 6, tar, 5, tar, s, 1);
  117. //Auto setup for Y:
  118.     set_axe(VERT1, clip.height(), ymin, ymax, -1, NULL, 2, NULL, NULL, 0);
  119.  
  120. // void show_axes(int ax_color, int legends_color,
  121. //    int grid_style, int grid_color, int width, int ticks_width, int set);
  122.     show_axes(14, 9, 1, 2, 3, 1, HORIZ1 + VERT1);
  123.  
  124.     setcolor(14); setfillstyle(5, 11);
  125.      cross();                       // Draw beginning of axes (0,0)
  126.  
  127.     plot_data(xar, dar, 5, BAR_GRAF, 1, shifts);
  128.     setcolor(15); setfillstyle(6, 14);
  129.     plot_data(xar, yar, 5, BAR_GRAF, 1, shifts);   // Plot second dataset
  130.     set_marker_size(4);
  131.     setcolor(9); setfillstyle(1, 7);
  132.     plot_data(xar, yar, 5, COMBINED_GRAF, 1, shifts);
  133.     set_marker_size(8);
  134. ///////////////////////////////////////////////////////////////////////////
  135.     for(i = 0; i < 20; i++)
  136.     shifts[i] = 0;
  137.      for(i = 1; i < 6; i++)
  138.     {
  139.     yar[i - 1] = (double)i * i - 10;
  140.     dar[i - 1] = (double)i * i / 2 - 5;
  141.     }
  142.  
  143.     set_graf_clip(230, 20, 380, 210);       // Rectangle on screen
  144.     calc_scale(xar, 0, 1, 5, 0);
  145.     calc_scale(dar, 1, 1, 5, -1);           // y-scale, first, resize
  146.     calc_scale(yar, 1, 0, 5, -1);           // y-scale, not first, resize
  147.     calc_scale(yar, 1, 0, 5, 1);
  148.     calc_scale(xar, 0, 0, 5, 1);
  149.  
  150.      set_axe(HORIZ1, clip.width(), xmin, xmax, -1, NULL, 2, NULL, NULL, 0);
  151.     set_axe(VERT1, clip.height(), ymin, ymax, -1, NULL, 2, NULL, NULL, 0);
  152.     set_axe(HORIZ2, clip.width(), xmin, xmax, -1, NULL, 5, NULL, NULL, 0);
  153.     set_axe(VERT2, clip.height(), ymin, ymax, -1, NULL, 2, NULL, NULL, 0);
  154. //Axes numeration: HORIZ1 = 1, VERT1 = 2, HORIZ2 = 4, VERT2 = 8
  155. // void show_axes(int ax_color, int legends_color,
  156. //    int grid_style, int grid_color, int width, int ticks_width, int set);
  157.     show_axes(14, 12, 0, 7, 3, 1, 1 + 2 + 4 + 8);
  158.     setcolor(11); setfillstyle(1, 3);
  159.     cross();
  160.     set_fill(ON);
  161.     plot_data(xar, yar, 5, BAR_3D_GRAF, 1, shifts);
  162.     setcolor(8); setfillstyle(1, 2);
  163.     plot_data(xar, dar, 5, BAR_3D_GRAF, 1, shifts);
  164.     for(i = 0; i < 20; i++)
  165.     shifts[i] = 0;
  166. /////////////////////////////////////////////////////////////////////////////
  167.     double rar[100];
  168.      double sar[100];
  169.      for(i = 1; i < 101; i++)
  170.     {
  171.     rar[i - 1] = i;
  172.     sar[i - 1] = (double)sin(3.6 * i) / 1000;  // sin() overloaded!
  173.     }
  174.     set_graf_clip(420, 20, 600, 210);
  175.     set_graf_scale(0, -1, 100, 2);                 // Manual scale ajustment
  176.  
  177.      set_axe(HORIZ1, clip.width(), xmin, xmax, -1, NULL, 2, NULL, NULL, 0);
  178.     set_axe(VERT1, clip.height(), ymin, ymax, -1, NULL, 2, NULL, NULL, 0);
  179.     set_axe(HORIZ2, clip.width(), xmin, xmax, -1, NULL, 2, NULL, NULL, 0);
  180.     set_axe(VERT2, clip.height(), ymin, ymax, -1, NULL, 2, NULL, NULL, 0);
  181.     show_axes(14, 12, 3, 7, 3, 1, 1 + 2 + 4 + 8);
  182.     cross();
  183.     setcolor(10); setfillstyle(1, 2); To_Paint::setlinestyle(3, 0);
  184.     plot_data(rar, sar, 100, LINE_GRAF, 1, shifts);
  185.     To_Paint::setlinestyle(1, 1);
  186. //''''''''''''''''''''''''''''''''' Add small graph at the corner of big one
  187. //'''''''''''''''''''''''''''''''''
  188.     for(i = 1; i < 101; i++)
  189.     sar[i - 1] = 100 * sar[i - 1];
  190.  
  191.     set_graf_clip(510, 35, 595, 90);
  192.     setfillstyle(1, 0);
  193.     rectangle(480, 20, 600, 120);
  194.     calc_scale(rar, 0, 1, 100, 0);
  195.      calc_scale(sar, 1, 1, 100, 0);
  196.  
  197.     set_axe(HORIZ1, clip.width(), xmin, xmax, -1, NULL, 2, NULL, NULL, 1);
  198.     set_axe(VERT1, clip.height(), ymin, ymax, -1, NULL, 2, NULL, NULL, 0);
  199.     show_axes(14, 12, -1, 7, 3, 1, 1 + 2);
  200.     cross();
  201.     setcolor(10); setfillstyle(1, 2); To_Paint::setlinestyle(3, 0);
  202.     plot_data(rar, sar, 100, LINE_GRAF, 1, shifts);
  203. /////////////////////////////////////////////////////////////////////////////
  204.      set_marker_size(16);
  205.     double zar[20];
  206. //                We set zar[] manually. The rules are:
  207. //                zar[4*i] keep ystart < 0;
  208. //         zar[4*i+1] keep ystart >= 0;
  209. //         zar[4*i+2] keep yend < 0;
  210. //         zar[4*i+3] keep yend >= 0;
  211. zar[0] = 0; zar[1] = 0; zar[2] = 0; zar[3] = 10;
  212. zar[4] = 0; zar[5] = 0; zar[6] = 0; zar[7] = 24;
  213. zar[8] = 0; zar[9] = 0; zar[10] = 0; zar[11] = 15;
  214. zar[12] = 0; zar[13] = 0; zar[14] = 0; zar[15] = 10;
  215. zar[16] = 0; zar[17] = 0; zar[18] = 0; zar[19] = 5;
  216.  
  217.     double aar[20];
  218.  
  219. aar[0] = 0;    aar[1] = 10; aar[2] = 0;     aar[3] = 12;
  220. aar[4] = 0;    aar[5] = 24; aar[8] = 0;     aar[7] = 25;
  221. aar[8] = 0;    aar[9] = 15; aar[10] = 0;    aar[11] = 25;
  222. aar[12] = 0;   aar[13] = 10; aar[14] = 0;   aar[15] = 15;
  223. aar[16] = 0;   aar[17] = 5; aar[18] = 0;    aar[19] = 7;
  224.  
  225.     set_graf_clip(20, 230, 240, 400);
  226.     calc_scale(xar, 0, 1, 5, 0);
  227.     calc_scale(zar, 1, 1, 20, 0);
  228.     calc_scale(aar, 1, 0, 20, -1);
  229.  
  230.     set_graf_scale(xmin, ymin * 1.2, xmax, ymax * 1.2);
  231.      calc_scale(xar, 0, 0, 5, 1);
  232.  
  233.     set_axe(HORIZ1, clip.width(), xmin, xmax, -1, NULL, 5, NULL, NULL, 0);
  234.     set_axe(VERT1, clip.height(), ymin, ymax, -1, NULL, 2, NULL, NUL